iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
AI & Data

用Python程式進行股票技術分析系列 第 11

Day11 自動價格趨勢線

  • 分享至 

  • xImage
  •  

今天也會引用Youtuber「neurotrader」的程式碼,他在影片「Automated Price Trend Lines in Python」中提到一種方法可以在區間內找出一條支撐線(support line)與一條壓力線(resistance line)。因為該方式用到區間概念,因此會先說明「直線趨勢線的周期」。

直線趨勢線的周期

與其他技術分析工具不同,直線趨勢線可以自行決定天期區間和長短。
因此可靈活運用直線趨勢線,且不同趨勢線可代表不同期間,短、中、長期趨勢的多空、強弱和支撐壓力。

程式實作:自動價格趨勢線函式

自動價格趨勢線函式的程式碼如下所示:

# 來源 : https://github.com/neurotrader888/TechnicalAnalysisAutomation/blob/main/trendline_automation.py
from myutils.TrendlineAutomation import fit_trendlines_single
from myutils.TrendlineAutomation import fit_trendlines_high_low

def FitTrendlines(prices, mode = 'close') :
    # 價格資料確認與處理
    if prices is None and type(prices) is not DataFrame:
        return None
    in_prices = prices.copy()
    if 'Open' not in in_prices.columns or 'High' not in in_prices.columns or 'Low' not in in_prices.columns or 'Close' not in in_prices.columns :
        return None    
    if 'Date' not in in_prices.columns and in_prices.index.dtype == 'datetime64[ns]' :
        in_prices.index.name = 'Date'
        in_prices = in_prices.reset_index()
    if 'Date' not in in_prices.columns :
        return None
    # 模式確認與處理
    prices_close=np.array(in_prices['Close'])
    if mode == 'close' :
        pass
    elif mode == 'high_low' :
        prices_high=np.array(in_prices['High'])
        prices_low=np.array(in_prices['Low'])
    else :
        return None
    # 擬合趨勢線
    if mode == 'close' :
        trendlines = fit_trendlines_single(prices_close)
    elif mode == 'high_low' :
        trendlines = fit_trendlines_high_low(prices_high,prices_low,prices_close)
    # 輸出格式處理
    trendline_start_index = in_prices.iloc[0].name
    trendline_end_index = in_prices.iloc[-1].name
    trendline_start_date = in_prices.iloc[0]['Date'].strftime('%Y-%m-%d')
    trendline_end_date = in_prices.iloc[-1]['Date'].strftime('%Y-%m-%d')
    support_slope  = trendlines[0][0]
    support_intercept = trendlines[0][1]
    support_trendline_start_price = support_slope * trendline_start_index + support_intercept
    support_trendline_end_price = support_slope * trendline_end_index + support_intercept
    resist_slope = trendlines[1][0]
    resist_intercept = trendlines[1][1]
    resist_trendline_start_price = resist_slope * trendline_start_index + resist_intercept
    resist_trendline_end_price = resist_slope * trendline_end_index + resist_intercept
    # 回傳資料處理
    ret_trendlines =  [[(trendline_start_date,support_trendline_start_price),(trendline_end_date,support_trendline_end_price)],
                       [(trendline_start_date,resist_trendline_start_price),(trendline_end_date,resist_trendline_end_price)]]
    return (trendlines,ret_trendlines)

在這邊先說明引用neurotrader程式的部分,用到兩個函式:

  • fit_trendlines_high_low函式:支撐線與壓力線會擬合至最高價與最低價,這個函式有三個輸入參數:最高價、最低價與收盤價。
  • fit_trendlines_single函式:支撐線與壓力線會擬合至所選定的價格。這個函式只有一個輸入參數,就是所選定的價格(為開盤價、最高價、收盤價與最低價其中之一,在這邊使用的是收盤價。)

兩個函式回傳都是支撐線與壓力線的斜率與截距,也就是直線方程式斜截式的兩個參數;可以參照Day8程式實作之說明。
其他程式碼內容以條列式方式的挑重點敘述:

  • 自動價格趨勢線函式輸入參數說明於下:
    • prices:區間價格 (資料型態:DataFrame)
    • mode:模式 (資料型態:str)
  • 自動價格趨勢線函式的回傳說明於下:
    • fit_trendlines_high_low函式或fit_trendlines_single函式的回傳值
    • 趨勢線資訊,包含兩條趨勢線開始位置索引、兩條趨勢線結束位置索引與日期、兩條趨勢線開始日期、兩條趨勢線結束日期、支撐線的斜率與截距、壓力線的斜率與截距、支撐線開始與結束的價格、壓力線開始與結束的價格
  • 自動價格趨勢線函式的前處理程序
    • 統一價格的DataFrame格式
    • 各模式所對應價格之設定(high_low模式使用最高價、最低價與收盤價,close模式只是用收盤價)
  • 自動價格趨勢線函式的主處理程序
    • high_low模式時呼叫fit_trendlines_high_low函式,close模式時呼叫fit_trendlines_single函式
    • 進行趨勢線(支撐線與壓力線)的擬合
  • 自動價格趨勢線函式的後處理程序
    • 轉換為輸出格式(趨勢線資訊)
    • 把fit_trendlines_high_low函式或fit_trendlines_single函式的回傳值與輸出資料合併成為函式回傳資料

程式實作:利用自動趨勢線函式繪製的趨勢線

將區間的價格資料(開、高、低、收、量)送入自動趨勢線函式。程式碼如下所示:

_,trendlines = FitTrendlines(df_k_line['2022-10-25':])

由於股票老師的「多頭看支撐不看壓力,空頭看壓力不看支撐」原則,因此只保留支撐線(上升趨勢線)。程式碼如下:

trendlines = trendlines[0]

之後利用以下程式繪製支撐線(上升趨勢線)與K線圖:

# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s  = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)

# 設定支撐線與壓力線
seq_of_seq_of_points=trendlines

# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), alines=dict(alines=seq_of_seq_of_points, linewidths=1.0, colors='xkcd:red', alpha=0.6), datetime_format='%Y-%m-%d')
mpf.plot(df_k_line,**kwargs)

程式執行結果如下:
Imgur
完整的程式碼請參照「第十一天:自動價格趨勢線.ipynb」。

回顧Day1的「主觀性質客觀化」

今天實作了Day1主觀性質客觀化的第二種方式(利用演算法以自動化方式來找尋或識別型態)於趨勢線課題上,但自動化程序還是會存在著無法完全涵蓋之處。而在我的8月30日股票投資筆記,其中有一段話剛好符合這個議題的討論:「只要符合趨勢線和型態學的理論依據,要怎麼畫都可以,這也正是形態學難學之處,因為可能同時存在多種圖形,而使用的人必須透過經驗去判斷,哪一種型態成型的機率最高。其實,技術分析裡面形態學跟價量關係,是最難的,因為很難制定訂出標準的SOP,很多都是經驗值和獨立事件,實務上應用,真的要靠多一些經驗值,因為變化太多了。所以像程式交易是無法完整的涵蓋形態學跟價量關係,偏偏這兩件事情,又非常重要」。因此主觀性質客觀化的第一種方式(將在看盤軟體繪製的圖形與線段以人工方式轉換成數據)還是有其存在的必要,並且這兩種方式的應用應該是互補而非互斥。


上一篇
Day10 轉折判斷的輔助工具
下一篇
Day12 型態理論
系列文
用Python程式進行股票技術分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言